From 50bbac60054b1558dcd459bdd8a5a93bda078b38 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?utf8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Fri, 29 Sep 2017 12:50:03 +0000 Subject: [PATCH] GDK W32: Correctly report window position in HiDPI mode Window position returned by get_frame_extents() should be scaled. Also take this opportunity to apply the same rounding that X11 backend applies. https://bugzilla.gnome.org/show_bug.cgi?id=788053 --- gdk/win32/gdkwindow-win32.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 9a20761034..4616d734a0 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -2114,16 +2114,25 @@ gdk_win32_window_get_frame_extents (GdkWindow *window, hwnd = GDK_WINDOW_HWND (window); API_CALL (GetWindowRect, (hwnd, &r)); - rect->x = r.left + _gdk_offset_x; - rect->y = r.top + _gdk_offset_y; - rect->width = (r.right - r.left) / impl->window_scale; - rect->height = (r.bottom - r.top) / impl->window_scale; + /* Initialize to real, unscaled size */ + rect->x = r.left + _gdk_offset_x * impl->window_scale; + rect->y = r.top + _gdk_offset_y * impl->window_scale; + rect->width = (r.right - r.left); + rect->height = (r.bottom - r.top); + + /* Extend width and height to ensure that they cover the real size when de-scaled, + * and replace everyting with scaled values + */ + rect->width = (rect->width + rect->x % impl->window_scale + impl->window_scale - 1) / impl->window_scale; + rect->height = (rect->height + rect->y % impl->window_scale + impl->window_scale - 1) / impl->window_scale; + rect->x = r.left / impl->window_scale + _gdk_offset_x; + rect->y = r.top / impl->window_scale + _gdk_offset_y; GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@%+ld%+ld\n", - GDK_WINDOW_HWND (window), - (r.right - r.left) / impl->window_scale, - (r.bottom - r.top) / impl->window_scale, - r.left, r.top)); + GDK_WINDOW_HWND (window), + rect->width, + rect->height, + rect->x, rect->y)); } static gboolean -- 2.30.2